//
//  "$Id: Mouse.h 94690 2012-12-24 06:41:34Z hao_shiming $"
//
//  Copyright(c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __MOUSE_API_H__
#define __MOUSE_API_H__

#include "Types.h"
#include "Defs.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup MouseAPI API Mouse
/// 鼠标和触摸屏设备API。
///	\n 调用流程图:
/// \code
///    ===========================
///				   |
///			createMouseDevice
///				   |
///				 start
///                |--------+
///				getdata		|
///                |--------+
///				 stop
///                |
///    ===========================
/// \endcode
/// @{

#define MOUSE_LBUTTON			0x1			///< 左键状态掩码。
#define MOUSE_RBUTTON			0x2			///< 右键状态掩码。
#define MOUSE_MBUTTON			0x4			///< 中键状态掩码。
#define MOUSE_TOUCHSCREEN		0x80		///< 触摸屏数据。

/// 鼠标输入数据结构
typedef struct tagMouseData
{
	/// 鼠标左右中3个按键的状态，置1表示按键按下，置0表示按键弹起。与宏\b MOUSE_XXX
	/// 相与得到对应按键的状态。最高位对应触摸屏标志，置1表示为触摸屏数据，置0
	/// 表示鼠标数据。 触摸屏按下弹起动作处理为左键。
	uchar key;

	/// X坐标偏移，正数向右，负数向左，取值[-127,128]。鼠标使用。
	schar x;

	/// y坐标偏移，正数向上，负数向下，取值[-127,128]。鼠标使用。
	schar y;

	/// 滚轮偏移，正数向后，负数向前，取值[-127,128]。鼠标使用。
	schar z;

	/// 绝对X坐标，正方向向右，取值[0,MOUSE_ABSOLUTE_MAX_X]。触摸屏使用。
	ushort ax;

	/// 绝对y坐标，正方向向下，取值[0,MOUSE_ABSOLUTE_MAX_Y]。触摸屏使用。
	ushort ay;	

	/// 保留字节，凑足128字节
	uchar resv[128 - 8];

} MouseData;

/// Monitor接口，32位下512字节
typedef struct tagMouse
{
	/// 底层私有数据
	void *priv;


	/// 创建鼠标设备
	/// 
	/// \param 无
	/// \retval <0 创建失败
	/// \retval 0 创建成功
	void (*start)(struct tagMouse *thiz);


	/// 一直等到读到一个完整的鼠标事件才返回，否则阻塞。如果鼠标外设被拔掉或不存在，
	/// 立即返回错误。出错时应用程序需要定时重试，周期不小于500ms，以实现热插拔功能。
	/// 
	/// \param [out] pData 指向鼠标时间结构MouseData的指针。
	/// \retval 0 读成功
	/// \retval <0 读失败
	int (*getdata)(struct tagMouse *thiz, MouseData *data);


	/// 销毁鼠标设备
	/// 
	/// \param 无
	/// \retval <0 销毁失败
	/// \retval 0 销毁成功
	void (*stop)(struct tagMouse *thiz);

	
	/// 保留字节
	int resv[252];
} Mouse;

/// 鼠标设备接口描述，128字节
typedef struct MouseDesc
{
	int channel;		///< 鼠标物理通道号
	int reserved[31];	///< 保留
} MouseDesc;

/// 创建鼠标设备
///
/// \param [in] desc 鼠标设备描述结构VideoInDesc指针
/// \param [out] layer 鼠标设备指针的指针
/// \retval <0 创建失败
/// \retval 0 创建成功
int PAL_API createMouseDevice(MouseDesc* desc, Mouse **mouse);

/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__MOUSE_API_H__


